1. 初始写入和读取操作
首先,这一部分列出了向SDRAM发出的写入(write)和读取(read)命令的步骤。这些步骤用于测试DDR内存的读写稳定性,特别是在信号延迟(skew)方面。
a. 向 SDRAM 发出以下命令
写入命令(Write Commands)
这部分包含了多个“写突发”命令(write burst),每个命令会将一组数据写入到SDRAM的不同目标寄存器(DTAR,即Data Target Register)。以下是各个写入命令的具体描述:
- Write burst of 8 to DTAR3 with data=x00/x00/x00/x00/x00/x00/x00/x00
- 向目标寄存器DTAR3写入8个数据单元(burst of 8),数据内容全为
x00
。
- 向目标寄存器DTAR3写入8个数据单元(burst of 8),数据内容全为
- Write burst of 8 to DTAR0 with data=x00/x00/x00/x00/x00/x00/x00/x00
- 向目标寄存器DTAR0写入8个数据单元,数据也是
x00
。
- 向目标寄存器DTAR0写入8个数据单元,数据也是
- Write burst of 8 to DTAR3 with data=x00/x00/x00/x00/x00/x00/x00/x00
- 再次向DTAR3写入8个数据单元,数据仍然是
x00
。
- 再次向DTAR3写入8个数据单元,数据仍然是
- Write burst of 8 to DTAR3 with data=x55/x55/x55/x55/x55/x55/x55/x55
- 向DTAR3写入8个数据单元,数据改为
x55
。
- 向DTAR3写入8个数据单元,数据改为
- Write burst of 8 to DTAR1 with data=x55/x55/x55/x55/x55/x55/x55/x55
- 向DTAR1写入8个数据单元,数据是
x55
。
- 向DTAR1写入8个数据单元,数据是
- Write burst of 8 to DTAR3 with data=x55/x55/x55/x55/xAA/xAA/xAA/xAA
- 向DTAR3写入8个数据单元,数据是
x55
和xAA
交替。
- 向DTAR3写入8个数据单元,数据是
- Write burst of 8 to DTAR2 with data=xAA/xAA/xAA/xAA/xAA/xAA/xAA/xAA
- 向DTAR2写入8个数据单元,数据全为
xAA
。
- 向DTAR2写入8个数据单元,数据全为
- Write burst of 8 to DTAR3 with data=xAA/xAA/xAA/xAA/xAA/xAA/xAA/xAA
- 再次向DTAR3写入8个数据单元,数据仍为
xAA
。
- 再次向DTAR3写入8个数据单元,数据仍为
- No-Operation (optional extended write DQS with DTCR.DTEXD)
- 执行一个不操作(No-Operation),这可能是为了扩展写操作中的DQS信号,用于调节时序。
- No-Operation
- 另一个不操作(No-Operation),此步骤可能用于等待或调整时序。
读取命令(Read Commands)
接下来的部分是读取命令(read burst)。这些命令用于读取前面写入的数据,并检查其是否正确。具体步骤如下:
- Read burst of 8 from DTAR0 with expected data=x00/x00/x00/x00/x00/x00/x00/x00
- 从DTAR0读取8个数据单元,期望数据是
x00
。
- 从DTAR0读取8个数据单元,期望数据是
- Read burst of 8 from DTAR1 with expected data=x55/x55/x55/x55/x55/x55/x55/x55
- 从DTAR1读取8个数据单元,期望数据是
x55
。
- 从DTAR1读取8个数据单元,期望数据是
- Read burst of 8 from DTAR0 with expected data=x00/x00/x00/x00/x00/x00/x00/x00
- 再次从DTAR0读取8个数据单元,期望数据仍是
x00
。
- 再次从DTAR0读取8个数据单元,期望数据仍是
- Read burst of 8 from DTAR2 with expected data=xAA/xAA/xAA/xAA/xAA/xAA/xAA/xAA
- 从DTAR2读取8个数据单元,期望数据是
xAA
。
- 从DTAR2读取8个数据单元,期望数据是
- Repeat read sequence n-times where n=DTCR.DTRPTN
- 重复读取过程n次,n的值由DTCR寄存器中的
DTRPTN
字段指定。
- 重复读取过程n次,n的值由DTCR寄存器中的
b. 评估读取数据(Evaluate the read data)
接下来,对读取的数据进行评估,以判断是否发生了数据偏移(data skew)或者时序错误(timing error)。
如果读取数据的偏移超过三个数据周期:
- 设置错误标志:当读取的数据偏移(skew)超过三个数据周期时,会触发一个错误状态,通过设置
PGSR0.RDERR=1
、DXnGSR2.RDERR=1
和DXnGSR2.ESTAT=0000
来标记错误。 - 标记读取完成:如果没有偏移错误,设置
PGSR0.RDDONE=1
,表示读取位对齐(read bit de-skew)已经完成。 - 退出数据训练:数据训练结束,退出后续的步骤。
如果读取的DQS信号相对于数据太早:
- 如果读取的DQS信号(读取时钟)太早相对于数据,这意味着时序可能有问题(例如时钟提前了),需要调整并进入步骤2
如果没有读取错误,或者读取的DQS信号相对于数据太晚:
- 如果没有检测到任何读取错误,或者DQS信号晚于数据时,跳过时序调整步骤,直接进入步骤3
2. DQS/DQS#信号过早
这部分提到,读取时钟信号(DQS/DQS#)比数据本身提前了,导致数据无法正确对齐。为了纠正这种情况,需要调整DQS/DQS#信号,使它与数据同步。
- 调整方法:
- 向后移动DQS/DQS#信号,即将DQS/DQS#信号延迟,或者
- 提前数据眼(read data eye),即提前数据本身,直到不再检测到数据不匹配(mis-compares),或者只在特定的“错误窗口”内(例如第6、7、22、23个周期)出现错误。
a. 读取命令(Read commands)
在调整DQS信号之前,系统执行一系列读取命令。这些读取命令包括从不同的目标寄存器(DTAR0、DTAR1、DTAR2)读取数据并对比预期数据。这些数据预期为:
- 读取DTAR0的数据:期望是
x00/x00/x00/x00/x00/x00/x00/x00
- 读取DTAR1的数据:期望是
x55/x55/x55/x55/x55/x55/x55/x55
- 再次读取DTAR0的数据:期望是
x00/x00/x00/x00/x00/x00/x00/x00
- 读取DTAR2的数据:期望是
xAA/xAA/xAA/xAA/xAA/xAA/xAA/xAA
重复读取:这些读取命令会根据DTCR.DTRPTN
寄存器的值重复执行多次。
b. 评估读取数据(Evaluate the read data)
评估读取数据是否存在错误,如果数据不匹配(mis-compare),系统会采取相应的措施。具体的评估步骤如下:
- 如果在8、9或24、25周期内检测到读取不匹配:
- 读取DQS信号的LCDL(Read DQS Delay)最大值:
- 如果读取DQS信号的LCDL已在最大值,且任何读取数据(DQ信号)的BDL(Bit Delay)处于最小值,则表示时序已经达到极限,无法进一步减少DQS延迟。因此,系统会:
- 标记错误:通过设置
PGSR0.RDERR=1
和DXnGSR2.RDERR=1
来标识错误,并将DXnGSR2.ESTAT
设置为0001
。 - 设置标志:
PGSR0.RDDONE=1
,表示读取位去偏(read bit de-skew)已完成。 - 退出数据训练:结束当前的时序调整过程。
- 标记错误:通过设置
- 如果读取DQS信号的LCDL已在最大值,且任何读取数据(DQ信号)的BDL(Bit Delay)处于最小值,则表示时序已经达到极限,无法进一步减少DQS延迟。因此,系统会:
- 如果读取DQS的LCDL仍在最大值,则:
- 减少所有读取数据(DQ)的BDL值,即减少数据的延迟,尝试通过调整数据时序来修正错误。
- 然后重复步骤2
- 如果读取DQS的LCDL值未达到最大,则:
- 增加DQS/DQS#的LCDL值,即延迟DQS/DQS#信号,以进一步调整时序。
- 然后重复步骤2
- 读取DQS信号的LCDL(Read DQS Delay)最大值:
- 如果没有读取不匹配(mis-compares),则可以继续进行下一步操作,跳过当前的时序调整过程,进入后续步骤3。
3. 找到读取数据眼的左边缘
- 在此过程中,系统需要找到读取数据眼的左边缘,即数据眼开始的最早时刻,直到在第8个和第24个周期内检测到一个或多个比特(bit)失败。
a. 执行读取命令
这里列出了具体的读取命令。这些命令将从不同的目标地址寄存器(DTAR0、DTAR1、DTAR2)读取数据,并且每次读取的数据与预期值进行对比。预期数据分别是:
- DTAR0:期望数据为
x00/x00/x00/x00/x00/x00/x00/x00
- DTAR1:期望数据为
x55/x55/x55/x55/x55/x55/x55/x55
- DTAR0:期望数据为
x00/x00/x00/x00/x00/x00/x00/x00
- DTAR2:期望数据为
xAA/xAA/xAA/xAA/xAA/xAA/xAA/xAA
这些命令会根据 DTCR.DTRPTN
(数据训练计数器)指定的重复次数进行多次执行。
b. 评估读取数据
在读取数据之后,系统将评估是否有数据不匹配(mis-compare),特别是在第8个周期和第24个周期。如果检测到比特错误,系统会根据以下步骤进行处理:
如果第8周期和第24周期的读取数据发生了不匹配(mis-compare),系统需要:
- 存储读取DQS/DQS#的LCDL值,即存储当前读取时钟的延迟值。这个值表示DQS信号相对于数据的时序偏差。
- 存储所有读取DQ(数据位)的BDL增量,即记录每个数据位的延迟值的增量(位延迟)。这些值存储在寄存器
DTEDR1.DTRLMN
和DTEDR2.DTRLMN
中。
接下来,系统将进入步骤4。
如果没有检测到不匹配(mis-compare),即读取数据正常,系统会继续检查并调整时序:
- 如果读取DQS/DQS#信号的LCDL值已经是最小值(即DQS信号无法再提前),并且任何读取DQ信号的BDL值已经是最大值(即数据位已经延迟到最大),则认为时序已经无法进一步优化,系统会:
- 标记错误:通过设置
PGSR0.RDERR=1
和DXnGSR2.RDERR=1
来标识错误,并将DXnGSR2.ESTAT
设置为0010
,表明错误的类型是时序错误。 - 设置完成标志:
PGSR0.RDDONE=1
,表示读取位去偏(read bit de-skew)已经完成。 - 退出数据训练:结束当前data training
- 标记错误:通过设置
- 如果读取DQS/DQS#的LCDL值仍在最小值,但其他条件符合,系统将:
- 增加所有读取DQ信号的BDL值(即将数据延迟调整增大)。
- 然后重新执行步骤3,继续评估数据。
- 如果DQS信号的LCDL值未达到最小值,则可以通过:
- 减少DQS/DQS#信号的LCDL值(即进一步延迟DQS信号)。
- 然后重复执行步骤3,再次评估数据。
- 如果读取DQS/DQS#信号的LCDL值已经是最小值(即DQS信号无法再提前),并且任何读取DQ信号的BDL值已经是最大值(即数据位已经延迟到最大),则认为时序已经无法进一步优化,系统会:
4. 去除所有读取DQ位的时序偏差
a. 执行读取命令
- 如同前面的步骤,这里依然需要执行一系列的读取命令,通过从不同的目标地址寄存器(DTAR0、DTAR1、DTAR2)进行读取。
- 这些读取操作会验证数据是否符合预期,确保没有时序错误发生。
读取命令如下:
- 从DTAR0读取,预期数据是
x00/x00/x00/x00/x00/x00/x00/x00
- 从DTAR1读取,预期数据是
x55/x55/x55/x55/x55/x55/x55/x55
- 从DTAR0读取,预期数据是
x00/x00/x00/x00/x00/x00/x00/x00
- 从DTAR2读取,预期数据是
xAA/xAA/xAA/xAA/xAA/xAA/xAA/xAA
每个读取操作会根据 DTCR.DTRPTN
设定的重复次数(n-times)执行多次。
b. 评估读取数据
执行完这些读取命令后,接下来对读取的数据进行评估。
- 如果检测到所有读取DQ位在第8个周期和第24个周期内发生不匹配(mis-compare),系统将继续执行步骤5,进入下一阶段的处理。
- 否则,如果检测到任何读取DQ的BDL(位延迟)已达到最大值,这意味着某些数据位已经调整到最大延迟,无法再进行进一步调整,系统会:
- 标记一个警告:通过设置
DXnGSR2.RDWN=1
来标记警告状态。 - 然后继续执行步骤5,即进入下一阶段。
- 标记一个警告:通过设置
- 否则,如果没有不匹配,并且没有达到最大BDL值,系统将继续执行调整操作:
- 对于每一个读取的DQ位,如果在所有的读取中,第8周期和第24周期没有发生不匹配,则将:
- 增加该DQ位的BDL值。这意味着系统会延迟这些数据位的时序,以使它们与其他位对齐。
- 对于每一个读取的DQ位,如果在所有的读取中,第8周期和第24周期没有发生不匹配,则将:
5. 对齐RDBI(读取数据总线反转)
a. 启用读取DBI功能
首先,需要在SDRAM中启用DBI(Data Bus Inversion)功能。通过将控制寄存器MR5
的第12位(bit 12)设置为1来启用该功能。这一步骤将允许SDRAM在读取数据时应用DBI。
1 | Enable read DBI functionality at the SDRAM by writing “1” to MR5 bit 12. |
b. 发出读取命令
接下来,发出一系列的读取命令,以便测试和调整RDBI的位置。这些命令的目的是检查数据总线反转(DBI)的效果,并确定它是否与数据总线(DQ)上的数据位对齐。
每个命令中包含了数据掩码(dm),这决定了哪些数据位需要反转。
第一个读取命令:
1 | Read burst of 8 from DTAR0 with expected data=xXX/x00/x00/x00/x00/x00/x00/x00 (post-DBI) / x55/xFF/xFF/xFF/xFF/xFF/xFF/xFF, dm=0x1/0x0/0x0/0x0/0x0/0x0/0x0/0x0 |
- DTAR0:表示从地址
DTAR0
开始读取数据。 - **xXX/x00/x00/…**:期望的初始数据。
xXX
表示需要反转的部分,其他x00
表示没有反转的数据。 - **x55/xFF/xFF/…**:这些是反转后期望的结果。
x55
表示数据反转后的值,xFF
表示RDBI引起的反转数据。 - **dm=0x1/0x0/…**:数据掩码,
0x1
表示第一个数据位需要反转,而后续的0x0
表示没有反转。
第二个读取命令:
1 | Read burst of 8 from DTAR2 with expected data=x00/xAA/xAA/xAA/xAA/xAA/xAA/xAA (post-DBI) / xFF/xAA/xAA/xAA/xAA/xAA/xAA/xAA, dm=0x0/0x1/0x1/0x1/0x1/0x1/0x1/0x1 |
- DTAR2:从地址
DTAR2
读取。 - 期望数据:这里的数据模式与第一个命令不同。
x00/xAA/...
表示后面的数据位发生反转。 - **dm=0x0/0x1/…**:数据掩码指示从第二位开始反转。
第三个读取命令:
1 | Read burst of 8 from DTAR0 with expected data=xAA/x00/x00/x00/x00/x00/x00/x00 (post-DBI) / xAA/xFF/xFF/xFF/xFF/xFF/xFF/xFF, dm=0x1/0x0/0x0/0x0/0x0/0x0/0x0/0x0 |
- DTAR0:再次从
DTAR0
地址读取数据。 - 期望数据:数据反转后的结果。
xAA/xFF/xFF/...
表示所有数据位在RDBI作用下反转。
第四个读取命令:
1 | Read burst of 8 from DTAR1 with expected data=x00/x55/x55/x55/x55/x55/x55/x55 (post-DBI) / xFF/x55/x55/x55/x55/x55/x55/x55, dm=0x0/0x1/0x1/0x1/0x1/0x1/0x1/0x1 |
- DTAR1:从地址
DTAR1
读取。 - 期望数据:这里也有反转的部分,如
x00/x55/...
表示部分数据进行反转。 - **dm=0x0/0x1/…**:表示从第二个数据位开始反转。
3. 重复读取命令
- 命令将根据
DTCR.DTRPTN
寄存器的值重复执行这些读取命令。这些命令会被执行n
次,以便验证RDBI的稳定性和一致性。
4. 评估读取数据
在执行完这些读取命令后,评估返回的数据,并根据以下情况判断RDBI的对齐位置:
情况 1:dm=0
在第8个周期和第24个周期
- 如果在周期8和24的
dm
值都为0
,那么RDBI要么与数据总线(DQ)完全对齐,或者它相对于DQ稍晚。 - 操作:将追踪方向设置为
1
,并继续执行步骤6。
情况 2:dm=1
在第8个周期和第24个周期
- 如果在周期8和24的
dm
值都为1
,那么RDBI要么与数据总线对齐,要么在数据总线之前。 - 操作:将追踪方向设置为
0
,并继续执行步骤6。
情况 3:dm
在两次周期中不同
- 如果在周期8和24中
dm
的值不同,则表示RDBI与数据总线对齐,即它与所有的DQ位对齐。 - 操作:继续执行步骤7。
6. 对齐RDBI(读数据总线反转)位
a. 发出读取命令
首先,需要发出一系列读取命令来测试RDBI位的对齐性。这些命令是从SDRAM中发出的,分别从不同的DTAR(数据传输地址寄存器)地址读取数据:
1. DTAR0地址的读取命令:
1 | Read burst of 8 from DTAR0 with expected data=xXX/x00/x00/x00/x00/x00/x00/x00 (post-DBI) / x55/xFF/xFF/xFF/xFF/xFF/xFF/xFF, dm=0x1/0x0/0x0/0x0/0x0/0x0/0x0/0x0 (on the bus). |
- DTAR0:数据传输地址寄存器0。
- 期望数据:
xXX/x00/x00/...
表示原始数据,x55/xFF/xFF/...
表示反转后的数据。数据的反转是通过RDBI控制的。 - dm:数据掩码,表示哪些数据位需要反转。在这个例子中,
dm=0x1
表示第一位需要反转,其他位不反转。
2. DTAR2地址的读取命令:
1 | Read burst of 8 from DTAR2 with expected data=x00/xAA/xAA/xAA/xAA/xAA/xAA/xAA (post-DBI) / xFF/xAA/xAA/xAA/xAA/xAA/xAA/xAA, dm=0x0/0x1/0x1/0x1/0x1/0x1/0x1/0x1 (on the bus). |
- DTAR2:从地址DTAR2读取数据。
- 期望数据:
x00/xAA/...
表示数据中有部分位将进行反转。 - dm:数据掩码指示哪些位需要反转,依次从第二位开始反转。
3. DTAR0的另一次读取命令:
1 | Read burst of 8 from DTAR0 with expected data=xAA/x00/x00/x00/x00/x00/x00/x00 (post-DBI) / xAA/xFF/xFF/xFF/xFF/xFF/xFF/xFF, dm=0x1/0x0/0x0/0x0/0x0/0x0/0x0/0x0 (on the bus). |
- DTAR0:再次从DTAR0读取数据。
- 期望数据:数据的反转方式与前一次不同。
4. DTAR1地址的读取命令:
1 | Read burst of 8 from DTAR1 with expected data=x00/x55/x55/x55/x55/x55/x55/x55 (post-DBI) / xFF/x55/x55/x55/x55/x55/x55/x55, dm=0x0/0x1/0x1/0x1/0x1/0x1/0x1/0x1 (on the bus). |
- DTAR1:从DTAR1读取数据。
- 期望数据:数据有一些位进行反转。
5. 重复读取命令:
- 重复命令:将这些读取命令重复执行
n
次,n
的值由DTCR.DTRPTN
寄存器指定,确保多次验证RDBI的对齐情况。
b. 评估读取数据
接下来,评估从SDRAM读取的数据,并根据追踪方向来确定RDBI的对齐位置。
追踪方向为0(RDBI在所有DQ位之后):
dm捕获值为0,在第8个和第24个周期:
如果RDBI的BDL(比特延迟线,Bit Delay Line)值在最小值时,并且任何DQ或DQS的BDL在最大值时,表示可能存在问题:
- 设置警告条件:通过设置
DXnGSR2.RDWN=1
来发出警告。 - 继续步骤7。
- 设置警告条件:通过设置
如果RDBI的BDL值在最小值时,增大所有DQ和DQS的BDL值。
如果上述条件都不满足,减少RDBI的BDL值。
重复步骤1直到在DTAR0读取命令的第一次周期中
dm=1
。
追踪方向为1(RDBI在所有DQ位之前):
dm捕获值为1,在第8个和第24个周期:
如果RDBI的BDL值在最大值时,并且任何DQ或DQS的BDL在最小值时,表示可能存在问题:
- 设置警告条件:通过设置
DXnGSR2.RDWN=1
来发出警告。
- 设置警告条件:通过设置
继续步骤6。
如果RDBI的BDL值在最大值时,减小所有DQ和DQS的BDL值。
- 如果上述条件都不满足,增大RDBI的BDL值。
- 重复步骤1直到在DTAR0读取命令的第一次周期中
dm=0
。
c. 禁用RDBI功能
在完成RDBI对齐的调整之后,最后一步是禁用RDBI功能,通过将MR5
寄存器的第12位写为0
来禁用RDBI。
7. 去除延时
恢复RDQS/RDQS#位置:
- 这一步是为了确保读选通信号与数据总线的正确对齐,将其移回到最初通过步骤1或步骤2找到的合适位置。
去除BDL延迟:
- 步骤3中可能添加的任何延迟都应该被清除,恢复到正常的信号传输延迟。
进入步骤8
8. 找到适当的时序点(右边缘)
目标
目的是在读取数据时序中找到适当的时序点(右边缘),并进行调整,直到在特定的读取周期(周期8和周期24)中发现一个或多个比特错误(bit failures)。
a. 发出读取命令
你将从SDRAM发出一系列读取命令,以触发和评估读数据的时序。
命令列表:
- 读取从DTAR0的8个数据位,期望的数据是
x00/x00/x00/x00/x00/x00/x00/x00
。 - 接着读取从DTAR1的8个数据位,期望的数据是
x55/x55/x55/x55/x55/x55/x55/x55
。 - 再次读取从DTAR0的8个数据位,期望的数据为
x00/x00/x00/x00/x00/x00/x00/x00
。 - 读取从DTAR2的8个数据位,期望的数据为
xAA/xAA/xAA/xAA/xAA/xAA/xAA/xAA
。 - 重复读取序列
根据DTCR.DTRPTN
的值重复执行上述步骤n
次,这样可以确保多次验证数据在不同读取周期下的表现。
b. 评估读取数据
完成读取命令后,你需要评估数据的正确性,并采取相应的操作:
1. 如果DTCR.DTBDC = 0
- 如果数据位检测控制(DTBDC)为0,表示没有检测到错误或比特失配(mis-compare),则直接进入步骤7,即继续执行后续操作。
2. 如果检测到比特错误
如果在周期4-11和周期20-27的读取中,存在任何比特错误(mis-compare),则会采取以下措施:
a. 存储右边缘位置
- 存储DQS/DQS# LCDL值:将DQS/DQS#信号的LCDL(读时钟延迟)值存储在
DTEDR1.DTRBMX
和DTEDR2.DTRLMX
寄存器中,表示检测到的时序位置。 - 存储增量值:将所有读取数据位(DQ)的BDL增量值存储在
DTEDR1.DTRNMX
和DTEDR2.DTRNMX
寄存器中。
b. 进入步骤7
- 存储DQS/DQS# LCDL值:将DQS/DQS#信号的LCDL(读时钟延迟)值存储在
3. 否则,进行时序调整
如果没有检测到比特错误,则需要检查并调整时序:
- 如果
read DQS/DQS# LCDL
在最大值,且任何读取DQ的BDL在最小值:- 标记错误条件:如果DQS/DQS#信号的LCDL在最大值时,且任何数据位DQ的BDL在最小值时,表示时序错误,需要标记错误条件:
- 通过设置
PGSR0.RDERR=1'b1
和DXnGSR2.RDERR=1'b1
标记读取错误。 - 通过设置
DXnGSR2.ESTAT=4'b0101
设置错误状态。
- 通过设置
- 设置读取完成标志:设置
PGSR0.RDDONE=1'b1
,表示读数据去偏移(bit de-skew)已经完成。 - 退出数据训练:由于时序错误,退出训练过程。
- 标记错误条件:如果DQS/DQS#信号的LCDL在最大值时,且任何数据位DQ的BDL在最小值时,表示时序错误,需要标记错误条件:
- 如果
read DQS/DQS# LCDL
不在最大值:- 调整时序:
- 如果**
read DQS/DQS# LCDL
在最大值,则需要将所有读取数据位的BDL值**递减(即减少延迟),以调整时序。 - 如果**
read DQS/DQS# LCDL
不在最大值,则需要递增`read DQS/DQS# LCDL的值**,即增加时序延迟。
- 如果**
- 重复步骤6:完成时序调整后,重新进行步骤6以再次评估数据并进行调整,直到时序正确。
- 调整时序:
9. 找到数据眼的中心位
目标
目的是通过计算读数据时钟(RDQS)的理想位置,使得数据眼的中心位于最佳的时序位置,从而保证读数据的时序对齐。该过程的关键是计算中心位置并调整读数据时钟(DQS/DQS#)的位置。
步骤解析
条件检查:
DTCR.DTBDC=0
- 如果DTCR.DTBDC的值为0,表示数据位检测控制(Data Bit Detection Control)没有启用,或者当前没有比特错误需要处理。在这种情况下:
- 直接进入步骤8,跳过进一步的时序调整。
- 如果DTCR.DTBDC的值为0,表示数据位检测控制(Data Bit Detection Control)没有启用,或者当前没有比特错误需要处理。在这种情况下:
计算DQS/DQS#中心位置:
- 如果**
DTCR.DTBDC≠0
(即启用了数据位检测控制,并且需要调整时序),则需要根据左边缘(Step 3)和右边缘(Step 6)的位置来计算理想的DQS/DQS#的中心位置**。计算公式如下:
$$
\text { RDQS center position }=(D T R L M X+D T R B M X)+\frac{(D T R L M N-D T R B M N)}{2}
$$这里涉及到4个寄存器的值:
- DTRLMX:左边缘的最大位置(来自Step 6的计算结果)。
- DTRBMX:右边缘的最大位置(来自Step 3的计算结果)。
- DTRLMN:左边缘的最小位置(Step 3计算结果的一部分)。
- DTRBMN:右边缘的最小位置(Step 6计算结果的一部分)。
通过计算公式,你可以得到DQS/DQS#的理想位置,即数据眼的中心位置。
- 如果**
调整DQS/DQS#位置:
- 将计算得到的中心位置应用到读时钟:
- 将**DQS/DQS#**时钟信号移动到上面计算的理想中心位置。
- 去除任何在Step 6中应用的BDL延迟,确保所有的数据位延迟(BDL)和时钟信号都调整到正确的中心位置。
- 将计算得到的中心位置应用到读时钟:
进入步骤8:
- 在完成DQS/DQS#位置的调整后,继续执行步骤8
10. 验证读操作是否能够正确进行
a. 发起一系列的读操作
首先,发起一系列的读取命令,从SDRAM中读取数据,并确认预期数据:
- 读取8个数据字节:
- 从 DTAR0 开始读取,预期数据为:
x00/x00/x00/x00/x00/x00/x00/x00
。 - 从 DTAR1 读取,预期数据为:
x55/x55/x55/x55/x55/x55/x55/x55
。 - 再次从 DTAR0 读取,预期数据为:
x00/x00/x00/x00/x00/x00/x00/x00
。 - 从 DTAR2 读取,预期数据为:
xAA/xAA/xAA/xAA/xAA/xAA/xAA/xAA
。
- 从 DTAR0 开始读取,预期数据为:
- 重复此读操作,根据 DTCR.DTRPTN 设置的次数来执行。这意味着你会根据配置,重复上述操作多个周期,以确保数据稳定性。
b. 评估读取的数据
读取操作之后,需要对读取的数据进行评估,以确定是否有时序错误(即数据是否准确,是否发生了比对错误):
- 检测读取错误:
- 如果在beats 4到11之间或20到27之间出现数据比对错误(mis-compare),这意味着在这些数据时隙内的读取结果与预期不匹配,可能是由于时序偏移或其他原因导致的错误。此时:
- 标记错误条件:通过设置以下寄存器标志来标记错误:
- PGSR0.RDERR 设置为
1'b1
,表示读取发生错误。 - DXnGSR2.RDERR 设置为
1'b1
,表示对应通道的读取错误。 - DXnGSR2.ESTAT 设置为
4'b0111
,表示错误的状态码,指示发生了读取比对错误。
- PGSR0.RDERR 设置为
- 标记数据训练完成:设置 PGSR0.RDDONE 为
1'b1
,表示数据位去偏移(de-skew)已经完成。 - 退出数据训练:由于发生了错误,训练过程需要结束,退出数据训练流程。
- 标记错误条件:通过设置以下寄存器标志来标记错误:
- 如果在beats 4到11之间或20到27之间出现数据比对错误(mis-compare),这意味着在这些数据时隙内的读取结果与预期不匹配,可能是由于时序偏移或其他原因导致的错误。此时:
- 没有检测到比对错误:
- 如果在读取的过程中没有检测到比对错误,则:
- 仅设置 PGSR0.RDDONE 为
1'b1
,表示数据位去偏移(de-skew)已经完成,且没有发现错误。 - 此时可以继续进入后续步骤,因为数据读取已经正常。
- 仅设置 PGSR0.RDDONE 为
- 如果在读取的过程中没有检测到比对错误,则:
NOTE
最小读DQS/DQS# LCDL延迟(x00)
最大读DQS/DQS# LCDL延迟(x1FF)
最小读DQ BDL延迟(x00)
最大读DQ BDL延迟(x3F)
本文链接: https://talent-tudou.github.io/2024/11/25/DDR/Data Training-Read Bit De-skew(2)/
版权声明: 本作品采用 CC BY-NC-SA 4.0 进行许可。转载请注明出处!